#include "libacl.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void imprimirUID(short uid);

void usage() {
    printf("Uso: acl_get <archivo>\n");
    printf("  <archivo> es el archivo cuya ACL se quiere listar\n");
}

int main(argc,argv)
int argc;
char**  argv;
{
    short lista[ITEMS_ACL];
    char bufmas[4];
    char bufmenos[4];
    short perms;
    int i, r;

    if (argc < 2) {
        printf("Error: faltan argumentos!\n");
        usage();
        return MISSING_ARG;
    }

    if (strlen(argv[1]) > PATH_MAX) {
        printf("Error: la ruta al archivo es demasiado larga!\n");
        return BAD_PATH;
    }

    r = aclget(argv[1], lista);
    
    /* Chequeo de errores */
    if (r == INODO_SIN_ACL) {
        printf("Error: el archivo no tiene ACL!\n");
        return r;
    }

    if (r == ERR_PIPE) {
        printf("Error: los pipes no soportan ACL!\n");
        return r;
    }

    if (r == ERR_PRIV) {
        printf("Error: permiso denegado!\n");
        return r;
    }

    if (r == ERR_INODO) {
        printf("Error: no se pudo acceder al archivo!\n");
        return r;
    }

    if (r == ERR_INODO_RO) {
        printf("Error: el archivo es de solo lectura!\n");
        return r;
    }
    
    if (r == ERR_SYS_COPY) {
        printf("Error: se produjo un error al copiar datos!\n");
        return r;
    }

    if (r != ACL_OK) {
        printf("Error: se produjo un error al intentar leer el ACL!\n");
        return r;
    }


    /* Imprimo por pantalla */
    printf("UID\t\t+\t-\n");
    printf("----------------------------------------\n");

    i = 0;
    while (i < ITEMS_ACL && lista[i] != 0) {
        
        imprimirUID(lista[i]);

        perms = lista[i+1];
        if (perms & MASR_BIT)   bufmas[0] = 'r';
        else                    bufmas[0] = '-';
        if (perms & MASW_BIT)   bufmas[1] = 'w';
        else                    bufmas[1] = '-';
        if (perms & MASX_BIT)   bufmas[2] = 'x';
        else                    bufmas[2] = '-';
        if (perms & MENOSR_BIT) bufmenos[0] = 'r';
        else                    bufmenos[0] = '-';
        if (perms & MENOSW_BIT) bufmenos[1] = 'w';
        else                    bufmenos[1] = '-';
        if (perms & MENOSX_BIT) bufmenos[2] = 'x';
        else                    bufmenos[2] = '-';

        printf("%s\t", bufmas);
        printf("%s\n", bufmenos);

        i = i + 2;
    }

    return 0;
}

void imprimirUID(short uid) {
    /* Intento mostrar el nombre del usuario, si no lo logro
     * imprimo el UID simplemente */
    FILE* usrdb;
    char* usrname;
    char line[256];
    short usr = 0;
    
    usrdb = fopen(PASSWD_FILE, "r");
    if (usrdb != NULL) {
        while(fgets(line, 256, usrdb) != NULL) {
            usrname = strtok(line, ":");
            strtok(NULL, ":");
            usr = atoi(strtok(NULL, ":"));

            if (usr == uid) {
                printf("%s\t\t", usrname);
                return;
            }
        }
        fclose(usrdb);
    }
    
    printf("UID %d\t\t", uid);
}
